/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Logica.Importancia;
import Logica.Empleado;
import Logica.PedidoRepuesto;
import Logica.Repuesto;
import Logica.Vehiculo;
import Persistencia.exceptions.NonexistentEntityException;
import Persistencia.exceptions.PreexistingEntityException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author Pablo
 */
public class PedidoRepuestoJpaController implements Serializable {
    
    
    public PedidoRepuestoJpaController(){
        emf = Persistence.createEntityManagerFactory("TpFinalPU");
    }


    public PedidoRepuestoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(PedidoRepuesto pedidoRepuesto) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Importancia unaImportancia = pedidoRepuesto.getUnaImportancia();
            if (unaImportancia != null) {
                unaImportancia = em.getReference(unaImportancia.getClass(), unaImportancia.getNivel());
                pedidoRepuesto.setUnaImportancia(unaImportancia);
            }
            Empleado unEmpleado = pedidoRepuesto.getUnEmpleado();
            if (unEmpleado != null) {
                unEmpleado = em.getReference(unEmpleado.getClass(), unEmpleado.getNroDoc());
                pedidoRepuesto.setUnEmpleado(unEmpleado);
            }
            Repuesto unRepuesto = pedidoRepuesto.getUnRepuesto();
            if (unRepuesto != null) {
                unRepuesto = em.getReference(unRepuesto.getClass(), unRepuesto.getCodigo());
                pedidoRepuesto.setUnRepuesto(unRepuesto);
            }
            Vehiculo unVehiculo = pedidoRepuesto.getUnVehiculo();
            if (unVehiculo != null) {
                unVehiculo = em.getReference(unVehiculo.getClass(), unVehiculo.getNroChasis());
                pedidoRepuesto.setUnVehiculo(unVehiculo);
            }
            em.persist(pedidoRepuesto);
            if (unaImportancia != null) {
                PedidoRepuesto oldUnPedidoOfUnaImportancia = unaImportancia.getUnPedido();
                if (oldUnPedidoOfUnaImportancia != null) {
                    oldUnPedidoOfUnaImportancia.setUnaImportancia(null);
                    oldUnPedidoOfUnaImportancia = em.merge(oldUnPedidoOfUnaImportancia);
                }
                unaImportancia.setUnPedido(pedidoRepuesto);
                unaImportancia = em.merge(unaImportancia);
            }
            if (unEmpleado != null) {
                PedidoRepuesto oldUnPedidoOfUnEmpleado = unEmpleado.getUnPedido();
                if (oldUnPedidoOfUnEmpleado != null) {
                    oldUnPedidoOfUnEmpleado.setUnEmpleado(null);
                    oldUnPedidoOfUnEmpleado = em.merge(oldUnPedidoOfUnEmpleado);
                }
                unEmpleado.setUnPedido(pedidoRepuesto);
                unEmpleado = em.merge(unEmpleado);
            }
            if (unRepuesto != null) {
                PedidoRepuesto oldUnPedidoOfUnRepuesto = unRepuesto.getUnPedido();
                if (oldUnPedidoOfUnRepuesto != null) {
                    oldUnPedidoOfUnRepuesto.setUnRepuesto(null);
                    oldUnPedidoOfUnRepuesto = em.merge(oldUnPedidoOfUnRepuesto);
                }
                unRepuesto.setUnPedido(pedidoRepuesto);
                unRepuesto = em.merge(unRepuesto);
            }
            if (unVehiculo != null) {
                unVehiculo.getPedidos().add(pedidoRepuesto);
                unVehiculo = em.merge(unVehiculo);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findPedidoRepuesto(pedidoRepuesto.getNroPedido()) != null) {
                throw new PreexistingEntityException("PedidoRepuesto " + pedidoRepuesto + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(PedidoRepuesto pedidoRepuesto) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            PedidoRepuesto persistentPedidoRepuesto = em.find(PedidoRepuesto.class, pedidoRepuesto.getNroPedido());
            Importancia unaImportanciaOld = persistentPedidoRepuesto.getUnaImportancia();
            Importancia unaImportanciaNew = pedidoRepuesto.getUnaImportancia();
            Empleado unEmpleadoOld = persistentPedidoRepuesto.getUnEmpleado();
            Empleado unEmpleadoNew = pedidoRepuesto.getUnEmpleado();
            Repuesto unRepuestoOld = persistentPedidoRepuesto.getUnRepuesto();
            Repuesto unRepuestoNew = pedidoRepuesto.getUnRepuesto();
            Vehiculo unVehiculoOld = persistentPedidoRepuesto.getUnVehiculo();
            Vehiculo unVehiculoNew = pedidoRepuesto.getUnVehiculo();
            if (unaImportanciaNew != null) {
                unaImportanciaNew = em.getReference(unaImportanciaNew.getClass(), unaImportanciaNew.getNivel());
                pedidoRepuesto.setUnaImportancia(unaImportanciaNew);
            }
            if (unEmpleadoNew != null) {
                unEmpleadoNew = em.getReference(unEmpleadoNew.getClass(), unEmpleadoNew.getNroDoc());
                pedidoRepuesto.setUnEmpleado(unEmpleadoNew);
            }
            if (unRepuestoNew != null) {
                unRepuestoNew = em.getReference(unRepuestoNew.getClass(), unRepuestoNew.getCodigo());
                pedidoRepuesto.setUnRepuesto(unRepuestoNew);
            }
            if (unVehiculoNew != null) {
                unVehiculoNew = em.getReference(unVehiculoNew.getClass(), unVehiculoNew.getNroChasis());
                pedidoRepuesto.setUnVehiculo(unVehiculoNew);
            }
            pedidoRepuesto = em.merge(pedidoRepuesto);
            if (unaImportanciaOld != null && !unaImportanciaOld.equals(unaImportanciaNew)) {
                unaImportanciaOld.setUnPedido(null);
                unaImportanciaOld = em.merge(unaImportanciaOld);
            }
            if (unaImportanciaNew != null && !unaImportanciaNew.equals(unaImportanciaOld)) {
                PedidoRepuesto oldUnPedidoOfUnaImportancia = unaImportanciaNew.getUnPedido();
                if (oldUnPedidoOfUnaImportancia != null) {
                    oldUnPedidoOfUnaImportancia.setUnaImportancia(null);
                    oldUnPedidoOfUnaImportancia = em.merge(oldUnPedidoOfUnaImportancia);
                }
                unaImportanciaNew.setUnPedido(pedidoRepuesto);
                unaImportanciaNew = em.merge(unaImportanciaNew);
            }
            if (unEmpleadoOld != null && !unEmpleadoOld.equals(unEmpleadoNew)) {
                unEmpleadoOld.setUnPedido(null);
                unEmpleadoOld = em.merge(unEmpleadoOld);
            }
            if (unEmpleadoNew != null && !unEmpleadoNew.equals(unEmpleadoOld)) {
                PedidoRepuesto oldUnPedidoOfUnEmpleado = unEmpleadoNew.getUnPedido();
                if (oldUnPedidoOfUnEmpleado != null) {
                    oldUnPedidoOfUnEmpleado.setUnEmpleado(null);
                    oldUnPedidoOfUnEmpleado = em.merge(oldUnPedidoOfUnEmpleado);
                }
                unEmpleadoNew.setUnPedido(pedidoRepuesto);
                unEmpleadoNew = em.merge(unEmpleadoNew);
            }
            if (unRepuestoOld != null && !unRepuestoOld.equals(unRepuestoNew)) {
                unRepuestoOld.setUnPedido(null);
                unRepuestoOld = em.merge(unRepuestoOld);
            }
            if (unRepuestoNew != null && !unRepuestoNew.equals(unRepuestoOld)) {
                PedidoRepuesto oldUnPedidoOfUnRepuesto = unRepuestoNew.getUnPedido();
                if (oldUnPedidoOfUnRepuesto != null) {
                    oldUnPedidoOfUnRepuesto.setUnRepuesto(null);
                    oldUnPedidoOfUnRepuesto = em.merge(oldUnPedidoOfUnRepuesto);
                }
                unRepuestoNew.setUnPedido(pedidoRepuesto);
                unRepuestoNew = em.merge(unRepuestoNew);
            }
            if (unVehiculoOld != null && !unVehiculoOld.equals(unVehiculoNew)) {
                unVehiculoOld.getPedidos().remove(pedidoRepuesto);
                unVehiculoOld = em.merge(unVehiculoOld);
            }
            if (unVehiculoNew != null && !unVehiculoNew.equals(unVehiculoOld)) {
                unVehiculoNew.getPedidos().add(pedidoRepuesto);
                unVehiculoNew = em.merge(unVehiculoNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                int id = pedidoRepuesto.getNroPedido();
                if (findPedidoRepuesto(id) == null) {
                    throw new NonexistentEntityException("The pedidoRepuesto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(int id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            PedidoRepuesto pedidoRepuesto;
            try {
                pedidoRepuesto = em.getReference(PedidoRepuesto.class, id);
                pedidoRepuesto.getNroPedido();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The pedidoRepuesto with id " + id + " no longer exists.", enfe);
            }
            Importancia unaImportancia = pedidoRepuesto.getUnaImportancia();
            if (unaImportancia != null) {
                unaImportancia.setUnPedido(null);
                unaImportancia = em.merge(unaImportancia);
            }
            Empleado unEmpleado = pedidoRepuesto.getUnEmpleado();
            if (unEmpleado != null) {
                unEmpleado.setUnPedido(null);
                unEmpleado = em.merge(unEmpleado);
            }
            Repuesto unRepuesto = pedidoRepuesto.getUnRepuesto();
            if (unRepuesto != null) {
                unRepuesto.setUnPedido(null);
                unRepuesto = em.merge(unRepuesto);
            }
            Vehiculo unVehiculo = pedidoRepuesto.getUnVehiculo();
            if (unVehiculo != null) {
                unVehiculo.getPedidos().remove(pedidoRepuesto);
                unVehiculo = em.merge(unVehiculo);
            }
            em.remove(pedidoRepuesto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<PedidoRepuesto> findPedidoRepuestoEntities() {
        return findPedidoRepuestoEntities(true, -1, -1);
    }

    public List<PedidoRepuesto> findPedidoRepuestoEntities(int maxResults, int firstResult) {
        return findPedidoRepuestoEntities(false, maxResults, firstResult);
    }

    private List<PedidoRepuesto> findPedidoRepuestoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(PedidoRepuesto.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public PedidoRepuesto findPedidoRepuesto(int id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(PedidoRepuesto.class, id);
        } finally {
            em.close();
        }
    }

    public int getPedidoRepuestoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<PedidoRepuesto> rt = cq.from(PedidoRepuesto.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
